#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
const int N=20050;
map<int,int> mp;
int n,m;
int p[N];
//0代表偶数次　1代表奇数次
int r[N];
int x,y;
char q[10];
bool flag=false;
int find(int x){
    if(x!=p[x]){
        int fa=find(p[x]);
        //更新ｒ
        // x-----p[x]--------new_p[x]
        // x-----------------new_p[x]
        //或者r[x]=(r[x]+r[p[x]])%2
        r[x]=r[x]^r[p[x]];
        //压缩路径
        p[x]=fa;
    }
    return p[x];
}
bool join(int a,int b,int d){
    int fa=find(a);
    int fb=find(b);
    if(fa==fb){
        if((r[a]^r[b])!=d){
            //true代表出现矛盾
            return true;
        }
        else{
            return false;
        }
    }
    else{
        p[fb]=fa;
        //比如r[a]: 1-5为奇数个 1  r[b]: 3-8为奇数个 1
        //而d就是1-3 假设为奇数个1 那么r[fb]就是5-8 应该为偶数个0
        r[fb]=(r[a]+d-r[b]+2)%2;
        return false;
    }
}
int main(void){
    //freopen("data.txt","r",stdin);
    //init
    int idx=1;
    mp.clear();
    for(int i=0;i<N;i++){
        p[i]=i;
        r[i]=0;
    }
    //input
    scanf("%d",&n);
    scanf("%d",&m);
    int ans=m;
    for(int i=1;i<=m;i++){
        scanf("%d%d %s",&x,&y,q);
        //离散化+闭区间处理
        if(!mp[x-1]){
            mp[x-1]=idx++;
        }
        if(!mp[y]){
            mp[y]=idx++;
        }
        if(flag){
            continue;
        }
        //printf("%s %d\n",q,strcmp(q,"even")==0);
        if(strstr(q,"even")){
            //printf("%d\n",i);
            if(join(mp[x-1],mp[y],0) && !flag){
                //printf("zheli\n");
                flag=true;
                ans=i-1;
            }
        }
        else{
            if(join(mp[x-1],mp[y],1) && !flag){
                //printf("nali\n");
                flag=true;
                ans=i-1;
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}
